const { Router } = require('express')

const { User, addUserValidate, editUserValidate } = require('../model/User')
const { Article } = require('../model/Article')

const { genSalt, hash } = require('bcrypt')

const { compare } = require('bcrypt')

const sexpage = require('mongoose-sex-page')

const { uploadFile } = require('../utils/upload-file')

const router = Router();

router.get('/', (req, res) => {
    res.send('博客管理页');
});

// 用户列表页
router.get('/user/list', async (req, res) => {
    // 当前页码
    const { page = 1 } = req.query;
    const data = await sexpage(User)
        .page(page)
        .size(3)
        .display(4)
        .find()
        .exec()
    res.render('admin/user-list', data);
});

// 添加用户页面渲染
router.get('/user/add', (req, res) => {
    res.render('admin/user-add', req.query);
});
// 添加用户功能实现
router.post('/user/add', async (req, res) => {
    // 获取注册用户信息
    const reqData = req.body;
    // 数据验证  如果result为true 则验证通过 否则返回错误信息
    const result = await addUserValidate(reqData).catch(err => err);
    // 通过url传递错误信息
    if (result instanceof Error) {
        return res.redirect(`/admin/user/add?errmsg=${result.message}`);
    }
    // 验证邮箱是否被注册过
    const user = User.findOne({ email: reqData.email });
    if (!user) {
        return res.redirect(`/admin/user/add?errmsg=该邮箱已注册`)
    }
    // 明文密码加密
    reqData.pwd = await hash(reqData.pwd, await genSalt());
    // 添加数据库
    await User.create(reqData);
    res.redirect('/admin/user/list');
});

// 修改用户页面渲染
router.get('/user/edit/:id', async (req, res) => {
    const { id } = req.params;
    let { errmsg } = req.query;
    let user = await User.findOne({ _id: id }).catch(err => null);
    if (!user) {
        // 这里不能调用res.redirect 重定向到自己了，因为会产生死循环
        errmsg = '找不到该用户'
        user = {}
    }
    res.render('admin/user-edit', { user, errmsg });
});
// 修改用户信息功能实现
router.post('/user/edit', async (req, res) => {
    // 获取用户修改的信息
    const { id, pwd, ...reqData } = req.body;
    // 数据验证
    let result = await editUserValidate(req.body).catch(err => err)
    // 通过url传递errmsg错误信息
    if (result instanceof Error) {
        return res.redirect(`/admin/user/edit/${id}?errmsg=${result.message}`)
    }
    // 验证用户是否存在
    const user = await User.findOne({ _id: id }).catch(err => null);
    if (!user) {
        return res.redirect(`/admin/user/edit/${id}?errmsg=找不到该用户`)
    }
    // 验证用户密码输入是否正确
    if (await compare(pwd, user.pwd)) {
        return res.redirect(`/admin/user/edit/${id}?errmsg=密码输入不正确`)
    }
    // 验证完成修改数据
    result = await User.updateOne({ _id: id }, reqData);
    if (!result.ok) {
        return res.redirect(`/admin/user/edit/${id}?errmsg=服务端异常，请稍后再试`)
    }
    res.redirect('/admin/user/list');
});

// 删除用户功能
router.get('/user/del', async (req, res) => {
    const { id } = req.query;
    if (!id) {
        return res.status(400).render('admin/error', { msg: '非法的id' })
    }
    const user = await User.findOneAndDelete({ _id: id }).catch(err => null)
    if (!user) {
        return res.status(400).render('admin/error', { msg: '找不到该用户' })
    }
    res.redirect('/admin/user/list');
});

// 文章列表页
router.get('/article/list', async (req, res) => {
    const { page = 1 } = req.query
    const data = await sexpage(Article)
        .page(page) // 当前页码
        .size(1) //每页条数
        .display(4) // 最多展示的页码个数，如果总共有10页，仅返回与当前页码临近的5个页码，如果总共小于5页，那么就只返回这个页码
        .find()
        .populate('author').exec()
    res.render('admin/article-list', data);
});

// 新增文章页
router.get('/article/add', (req, res) => {
    res.render('admin/article-add');
});
// 上传文件及文章基本信息
router.post('/article/add', async (req, res) => {
    const result = await uploadFile(req);
    if (!result) {
        return res.status(500).render('admin/error', { msg: '文件上传失败，文件大小不能超过20MB' })
    }
    await Article.create({ ...result.fields, cover: result.files.cover.join(',') })
    res.redirect('/admin/article/list')
    // res.send(result)
});

module.exports = { router };